﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Windows.Media;
using System.Windows;
using Common.Export;
using Otgruzka.Helpers;
using DataTier.Entities;

namespace Otgruzka.Export
{
    public class ConsAccInvoiceToExcel
    {
        public int RowsAfterRow = 0;
        public Common.Export.ExcelDocument Document { get; private set; }

        public ConsAccInvoiceToExcel()
        {
            var doc = prepareDocument(); // Создание пустого документа
            createStyles(doc); // Создание списка стилей, которые можно будет использовать в документе
            this.Document = doc;
        }


        private Common.Export.ExcelDocument prepareDocument()
        {
            var doc = new Common.Export.ExcelDocument();

            Common.Export.WindowProperties wp = new Common.Export.WindowProperties()
            {
                WindowHeight = 12015,
                WindowWidth = 19440,
                WindowTopX = 480,
                WindowTopY = 150
            };

            Common.Export.DocumentProperties dp = new Common.Export.DocumentProperties()
            {
                Author = "",
                LastAuthor = "",
                Company = "Компания МЕГА",
                Version = 1.00
            };

            doc.Header = new Common.Export.ExcelHeader()
            {
                WindowProperties = wp,
                DocumentProperties = dp
            };

            var workSheet = new Common.Export.Worksheet()
            {
                Name = "Отгрузка",
                Table = new Common.Export.Table()
            };


            doc.Worksheets.Add(workSheet);

            return doc;
        }


        /// <summary>
        /// Создание стилей для оформления документа
        /// </summary>
        /// <param name="doc"></param>
        private void createStyles(Common.Export.ExcelDocument doc)
        {
            var styleBold = new Common.Export.CellStyle()
            {
                ID = "bold",
                Borders = new Thickness(1),
                FontSize = 7,
                FontWeight = FontWeights.Bold,
                TextWrapping = TextWrapping.Wrap,
                FontStyle = FontStyles.Normal,
                VerticalAlignment = VerticalAlignment.Center,
                FontFamily = new FontFamily("Arial")
            };
            var styleBoldNonBorder = new Common.Export.CellStyle()
            {
                ID = "boldNonBorder",
                FontSize = 7,
                FontWeight = FontWeights.Bold,
                TextWrapping = TextWrapping.Wrap,
                FontStyle = FontStyles.Normal,
                VerticalAlignment = VerticalAlignment.Center,
                FontFamily = new FontFamily("Arial")
            };
            var style = new Common.Export.CellStyle()
            {
                ID = "normal",
                Borders = new Thickness(1, 1, 1, 1),
                FontSize = 7,
                FontWeight = FontWeights.Normal,
                TextWrapping = TextWrapping.Wrap,
                FontStyle = FontStyles.Normal,
                VerticalAlignment = VerticalAlignment.Center,
                FontFamily = new FontFamily("Arial")
            };
            var styleNormalNonBorder = new Common.Export.CellStyle()
            {
                ID = "normalNonBorder",
                FontSize = 7,
                FontWeight = FontWeights.Normal,
                TextWrapping = TextWrapping.Wrap,
                FontStyle = FontStyles.Normal,
                VerticalAlignment = VerticalAlignment.Center,
                FontFamily = new FontFamily("Arial")
            };
            var styleNormalNonBorderF8 = new Common.Export.CellStyle()
            {
                ID = "normalNonBorderF8",
                FontSize = 8,
                FontWeight = FontWeights.Normal,
                TextWrapping = TextWrapping.Wrap,
                FontStyle = FontStyles.Normal,
                VerticalAlignment = VerticalAlignment.Center,
                FontFamily = new FontFamily("Arial")
            };
            var styleRightNonBorderF8 = new Common.Export.CellStyle()
            {
                ID = "rightNonBorderF8",
                FontSize = 8,
                FontWeight = FontWeights.Normal,
                TextWrapping = TextWrapping.Wrap,
                FontStyle = FontStyles.Normal,
                HorizontalAlignment = HorizontalAlignment.Right,
                VerticalAlignment = VerticalAlignment.Center,
                FontFamily = new FontFamily("Arial")
            };
            var styleCenterNonBorderF8 = new Common.Export.CellStyle()
            {
                ID = "centerNonBorderF8",
                FontSize = 8,
                FontWeight = FontWeights.Normal,
                TextWrapping = TextWrapping.Wrap,
                FontStyle = FontStyles.Normal,
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment = VerticalAlignment.Center,
                FontFamily = new FontFamily("Arial")
            };
            var styleCenterBorderF8 = new Common.Export.CellStyle()
            {
                ID = "centerBorderF8",
                Borders = new Thickness(1, 1, 1, 1),
                FontSize = 8,
                FontWeight = FontWeights.Normal,
                TextWrapping = TextWrapping.Wrap,
                FontStyle = FontStyles.Normal,
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment = VerticalAlignment.Center,
                FontFamily = new FontFamily("Arial")
            };

            var styleBoldHeaderNonBorderF11 = new Common.Export.CellStyle()
            {
                ID = "boldHeaderNonBorderF11",
                FontSize = 11,
                FontWeight = FontWeights.Bold,
                TextWrapping = TextWrapping.Wrap,
                FontStyle = FontStyles.Normal,
                VerticalAlignment = VerticalAlignment.Center,
                FontFamily = new FontFamily("Arial")
            };
            var normalBold = new Common.Export.CellStyle()
            {
                ID = "normalBold",
                Borders = new Thickness(1, 1, 1, 1),
                FontSize = 7,
                FontWeight = FontWeights.Bold,
                TextWrapping = TextWrapping.Wrap,
                FontStyle = FontStyles.Normal,
                VerticalAlignment = VerticalAlignment.Center,
                FontFamily = new FontFamily("Arial")
            };
            var boldCenterHeadFoot = new Common.Export.CellStyle()
            {
                ID = "boldCenterHeadFoot",
                Borders = new Thickness(1),
                FontSize = 7,
                FontWeight = FontWeights.Bold,
                TextWrapping = TextWrapping.Wrap,
                FontStyle = FontStyles.Normal,
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment = VerticalAlignment.Center,
                FontFamily = new FontFamily("Arial")
            };
            var normalCenter = new Common.Export.CellStyle()
            {
                ID = "normalCenter",
                Borders = new Thickness(1, 1, 1, 1),
                FontSize = 7,
                FontWeight = FontWeights.Normal,
                TextWrapping = TextWrapping.Wrap,
                FontStyle = FontStyles.Normal,
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment = VerticalAlignment.Center,
                FontFamily = new FontFamily("Arial"),
                NumberFormat = "Standard"
            };
            var normalRight = new Common.Export.CellStyle()
            {
                ID = "normalRight",
                Borders = new Thickness(1, 1, 1, 1),
                FontSize = 7,
                FontWeight = FontWeights.Normal,
                TextWrapping = TextWrapping.Wrap,
                FontStyle = FontStyles.Normal,
                HorizontalAlignment = HorizontalAlignment.Right,
                VerticalAlignment = VerticalAlignment.Center,
                FontFamily = new FontFamily("Arial"),
                NumberFormat = "Standard"
            };

            var boldCenterRight = new Common.Export.CellStyle()
            {
                ID = "boldCenterRight",
                Borders = new Thickness(1, 1, 1, 1),
                FontSize = 7,
                FontWeight = FontWeights.Bold,
                TextWrapping = TextWrapping.Wrap,
                FontStyle = FontStyles.Normal,
                HorizontalAlignment = HorizontalAlignment.Right,
                VerticalAlignment = VerticalAlignment.Center,
                FontFamily = new FontFamily("Arial"),
                NumberFormat = "Standard"
            };

            var borderBottom = new Common.Export.CellStyle()
            {
                ID = "borderBottom",
                Borders = new Thickness(0, 0, 0, 1),
                FontSize = 8,
                TextWrapping = TextWrapping.Wrap,
                FontStyle = FontStyles.Normal,
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment = VerticalAlignment.Center,
                FontFamily = new FontFamily("Arial")
            };

            doc.Styles.Add(styleBold);
            doc.Styles.Add(styleBoldNonBorder);
            doc.Styles.Add(style);
            doc.Styles.Add(normalBold);
            doc.Styles.Add(styleNormalNonBorder);
            doc.Styles.Add(styleNormalNonBorderF8);
            doc.Styles.Add(styleCenterBorderF8);
            doc.Styles.Add(styleRightNonBorderF8);
            doc.Styles.Add(styleCenterNonBorderF8);
            doc.Styles.Add(styleBoldHeaderNonBorderF11);
            doc.Styles.Add(boldCenterHeadFoot);
            doc.Styles.Add(normalRight);
            doc.Styles.Add(boldCenterRight);
            doc.Styles.Add(normalCenter);
            doc.Styles.Add(borderBottom);
        }


        /// <summary>
        /// Оформление документа созданными стилями
        /// </summary>
        /// <param name="doc"></param>
        private void setStyles(Common.Export.ExcelDocument doc)
        {
            var tbl = doc.Worksheets[0].Table;

            //tbl.BeforeRows.ForEach(row => row.Cells.ForEach(cell => cell.StyleID = "normalNonBorderF8"));
            tbl.HeaderRows.ForEach(row => row.Cells.ForEach(cell => cell.StyleID = "normalCenter")); // boldCenterHeadFoot
            //tbl.Rows.ForEach(row => row.Cells.ForEach(cell => cell.StyleID = "normal"));
            for (int i = 0; i < tbl.Rows.Count - RowsAfterRow; i++)
            {
                tbl.Rows[i].Cells.ForEach(cell => cell.StyleID = "normal");
            }

            #region К колонкам таблицы применяется выборочная стилистика
            for (int i = 0; i < tbl.Rows.Count - (RowsAfterRow + 1); ++i)
            {
                if (tbl.Rows[i].Cells.Count > 0) tbl.Rows[i].Cells[0].StyleID = "normalCenter";
                if (tbl.Rows[i].Cells.Count > 1) tbl.Rows[i].Cells[1].StyleID = "normalCenter";
                //2 (если не применяется ничего, то остается стиль по-умолчанию, указанный выше в данном методе. Это стиль normal)
                //3
                if (tbl.Rows[i].Cells.Count > 4) tbl.Rows[i].Cells[4].StyleID = "normalCenter";
                if (tbl.Rows[i].Cells.Count > 5) tbl.Rows[i].Cells[5].StyleID = "normalCenter";
                if (tbl.Rows[i].Cells.Count > 6) tbl.Rows[i].Cells[6].StyleID = "normalCenter";
                if (tbl.Rows[i].Cells.Count > 7) tbl.Rows[i].Cells[7].StyleID = "normalCenter";
                if (tbl.Rows[i].Cells.Count > 8) tbl.Rows[i].Cells[8].StyleID = "normalRight";
                if (tbl.Rows[i].Cells.Count > 9) tbl.Rows[i].Cells[9].StyleID = "normalRight";
                if (tbl.Rows[i].Cells.Count > 10) tbl.Rows[i].Cells[10].StyleID = "normalRight";
                if (tbl.Rows[i].Cells.Count > 11) tbl.Rows[i].Cells[11].StyleID = "normalRight";
                //12
                //13
                if (tbl.Rows[i].Cells.Count > 14) tbl.Rows[i].Cells[14].StyleID = "normalCenter";
            }
            #endregion К колонкам таблицы применяется выборочная стилистика

            // Для строки с итоговыми строками применяется жирный шрифт
            if (tbl.Rows.Count > 0)
            {
                var footerRow = tbl.Rows[tbl.Rows.Count - (RowsAfterRow + 1)];
                footerRow.Cells.ForEach(cell => cell.StyleID = "boldCenterRight");
                if (footerRow.Cells.Count > 0) footerRow.Cells[0].StyleID = "normalBold";
            }

            //// Стили к строкам, размещенным после таблицы
            //for (int i = tbl.Rows.Count - RowsAfterRow; i < tbl.Rows.Count; ++i)
            //{
            //    tbl.Rows[i].Cells.ForEach(cell => cell.StyleID = "normalNonBorder");
            //}
        }


        /// <summary>
        /// Создание столбцов и заголовков формируемого файла
        /// </summary>
        /// <param name="table"></param>
        /// <param name="data"></param>
        private void createExcelColumnsAndHeaders(Common.Export.Table table, ConsolidatedAccountInvoiceEntity entity)
        {
            #region Создаются и настраиваются колонки Excel-файла (191 одинаково узких колонок)
             //int index = 1;
            //table.Columns.Add(new Common.Export.Column() { AutoFitWidth = 1, Width = 40.0, Index = index++ });
            //table.Columns.Add(new Common.Export.Column() { AutoFitWidth = 1, Width = 60.0, Index = index++ });
            //table.Columns.Add(new Common.Export.Column() { AutoFitWidth = 1, Width = 177.0, Index = index++ });
            //table.Columns.Add(new Common.Export.Column() { AutoFitWidth = 1, Width = 35.25, Index = index++ });
            //table.Columns.Add(new Common.Export.Column() { AutoFitWidth = 1, Width = 35.25, Index = index++ });
            //table.Columns.Add(new Common.Export.Column() { AutoFitWidth = 1, Width = 55.5, Index = index++ });
            //table.Columns.Add(new Common.Export.Column() { AutoFitWidth = 1, Width = 38.25, Index = index++ });
            //table.Columns.Add(new Common.Export.Column() { AutoFitWidth = 1, Width = 38.25, Index = index++ });
            //table.Columns.Add(new Common.Export.Column() { AutoFitWidth = 1, Width = 39.75, Index = index++ });
            //table.Columns.Add(new Common.Export.Column() { AutoFitWidth = 1, Width = 39.75, Index = index++ });
            //table.Columns.Add(new Common.Export.Column() { AutoFitWidth = 1, Width = 39.75, Index = index++ });
            //table.Columns.Add(new Common.Export.Column() { AutoFitWidth = 1, Width = 39.75, Index = index++ });
            //table.Columns.Add(new Common.Export.Column() { AutoFitWidth = 1, Width = 34.5, Index = index++ });
            //table.Columns.Add(new Common.Export.Column() { AutoFitWidth = 1, Width = 36.0, Index = index++ });
            //table.Columns.Add(new Common.Export.Column() { AutoFitWidth = 1, Width = 82.5, Index = index++ });
            for (int index = 1; index <= 151; index++)
            {
                table.Columns.Add(new Common.Export.Column() { AutoFitWidth = 1, Width = 4.5, Index = index });
            }
            #endregion Создаются и настраиваются колонки Excel-файла

            #region Строки шапки, располагается над таблицей с данными
            var row1 = new Common.Export.Row() { Height = 47.25 };
            for (int i = 1; i <= 106; i++) // 104 - 1 + 43
                row1.Cells.Add(new Common.Export.Cell() { Type = "String" });
            row1.Cells.Add(new Common.Export.Cell() { StyleID = "normalNonBorderF8", Data = "Типовая межотраслевая форма № М-15" + SpecSymbols.NewLine + "Утверждена Постановлением Госкомстата России" + SpecSymbols.NewLine + "от 30.10.97 № 71а", Type = "String", MergeAcross = 44 });
            table.BeforeRows.Add(row1);

            var row2 = new Common.Export.Row();
            for (int i = 1; i <= 51; i++)
                row2.Cells.Add(new Common.Export.Cell() { Type = "String" });
            row2.Cells.Add(new Common.Export.Cell() { StyleID = "boldHeaderNonBorderF11", Data = "НАКЛАДНАЯ № ", Type = "String", MergeAcross = 34 });
            for (int i = 1; i <= 65; i++)
                row2.Cells.Add(new Common.Export.Cell() { Type = "String" });
            table.BeforeRows.Add(row2);

            var row3 = new Common.Export.Row();
            for (int i = 1; i <= 45; i++)
                row3.Cells.Add(new Common.Export.Cell() { Type = "String" });
            row3.Cells.Add(new Common.Export.Cell() { StyleID = "boldHeaderNonBorderF11", Data = "на отпуск материалов на сторону", Type = "String", MergeAcross = 41 });
            for (int i = 1; i <= 46; i++)
                row3.Cells.Add(new Common.Export.Cell() { Type = "String" });
            row3.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Data = "Коды", Type = "String", MergeAcross = 17 });
            table.BeforeRows.Add(row3);

            var row4 = new Common.Export.Row();
            for (int i = 1; i <= 117; i++)
                row4.Cells.Add(new Common.Export.Cell() { Type = "String" });
            row4.Cells.Add(new Common.Export.Cell() { StyleID = "rightNonBorderF8", Data = "Форма по ОКУД", Type = "String", MergeAcross = 14 });
            row4.Cells.Add(new Common.Export.Cell() { Type = "String" });
            row4.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Data = "0315007", Type = "String", MergeAcross = 17 });
            table.BeforeRows.Add(row4);

            var row5 = new Common.Export.Row();
            row5.Cells.Add(new Common.Export.Cell() { StyleID = "normalNonBorderF8", Data = string.Format("Организация: \"{0}\"", entity.JuridicalPerson.Name), Type = "String", MergeAcross = 120 });
            row5.Cells.Add(new Common.Export.Cell() { Type = "String" });
            row5.Cells.Add(new Common.Export.Cell() { StyleID = "rightNonBorderF8", Data = "по ОКПО", Type = "String", MergeAcross = 9 });
            row5.Cells.Add(new Common.Export.Cell() { Type = "String" });
            row5.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Data = "", Type = "String", MergeAcross = 17 });
            table.BeforeRows.Add(row5);

            // Пустая строка-разделитель
            var row6 = new Common.Export.Row();
            for (int i = 1; i <= 151; i++)
                row6.Cells.Add(new Common.Export.Cell() { Type = "String" });
            table.BeforeRows.Add(row6);

            var row7 = new Common.Export.Row();
            for (int i = 1; i <= 28; i++)
                row7.Cells.Add(new Common.Export.Cell() { Type = "String" });
            row7.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Data = "Дата составления", Type = "String", MergeAcross = 20, MergeDown = 1 });
            row7.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Data = "Период", Type = "String", MergeAcross = 8, MergeDown = 1 });
            row7.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Data = "Отправитель", Type = "String", MergeAcross = 26 });
            row7.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Data = "Получатель", Type = "String", MergeAcross = 26 });
            row7.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Data = "Ответственный за поставку", Type = "String", MergeAcross = 38 });
            table.BeforeRows.Add(row7);

            var row8 = new Common.Export.Row() { Height = 50 };
            for (int i = 1; i <= 28; i++)
                row8.Cells.Add(new Common.Export.Cell() { Type = "String" });
            row8.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Data = "структурное подразделение", Type = "String", MergeAcross = 13, Index = 59 });
            row8.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Data = "вид деятельности", Type = "String", MergeAcross = 12 });
            row8.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Data = "структурное подразделение", Type = "String", MergeAcross = 13 });
            row8.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Data = "вид деятельности", Type = "String", MergeAcross = 12 });
            row8.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Data = "структурное подразделение", Type = "String", MergeAcross = 13 });
            row8.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Data = "вид деятельности", Type = "String", MergeAcross = 12 });
            row8.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Data = "код исполнителя", Type = "String", MergeAcross = 11 });
            table.BeforeRows.Add(row8);

            var row9 = new Common.Export.Row();
            for (int i = 1; i <= 28; i++)
                row9.Cells.Add(new Common.Export.Cell() { Type = "String" });
            row9.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Type = "String", MergeAcross = 20 });
            row9.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Type = "String", MergeAcross = 8 });
            row9.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Type = "String", MergeAcross = 13 });
            row9.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Type = "String", MergeAcross = 12 });
            row9.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Type = "String", MergeAcross = 13 });
            row9.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Type = "String", MergeAcross = 12 });
            row9.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Type = "String", MergeAcross = 13 });
            row9.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Type = "String", MergeAcross = 12 });
            row9.Cells.Add(new Common.Export.Cell() { StyleID = "centerBorderF8", Type = "String", MergeAcross = 11 });
            table.BeforeRows.Add(row9);

            // Пустая строка-разделитель
            var row10 = new Common.Export.Row();
            for (int i = 1; i <= 151; i++)
                row10.Cells.Add(new Common.Export.Cell() { Type = "String" });
            table.BeforeRows.Add(row10);

            var row11 = new Common.Export.Row();
            row11.Cells.Add(new Common.Export.Cell() { StyleID = "rightNonBorderF8", Data = "Основание ", Type = "String", MergeAcross = 10 });
            row11.Cells.Add(new Common.Export.Cell() { StyleID = "borderBottom", Type = "String", MergeAcross = 139 });
            table.BeforeRows.Add(row11);

            var row12 = new Common.Export.Row();
            row12.Cells.Add(new Common.Export.Cell() { StyleID = "rightNonBorderF8", Data = "Кому ", Type = "String", MergeAcross = 10 });
            row12.Cells.Add(new Common.Export.Cell() { StyleID = "borderBottom", Type = "String", MergeAcross = 65 });
            row12.Cells.Add(new Common.Export.Cell() { Type = "String" });
            row12.Cells.Add(new Common.Export.Cell() { StyleID = "rightNonBorderF8", Data = "Через кого ", Type = "String", MergeAcross = 10 });
            row12.Cells.Add(new Common.Export.Cell() { StyleID = "borderBottom", Type = "String", MergeAcross = 61 });
            table.BeforeRows.Add(row12);

            // Пустая строка-разделитель
            var row13 = new Common.Export.Row();
            for (int i = 1; i <= 151; i++)
                row13.Cells.Add(new Common.Export.Cell() { Type = "String" });
            table.BeforeRows.Add(row13);

            #endregion //Строки шапки, располагается над таблицей с данными

            #region Формируются ТРИ строки заголовка таблицы

            var headerrow1 = new Common.Export.Row();
            headerrow1.Cells.Add(new Common.Export.Cell() { Data = "Корреспондирующий счет", MergeAcross = 19 });
            headerrow1.Cells.Add(new Common.Export.Cell() { Data = "Материальные ценности", MergeAcross = 38 });
            headerrow1.Cells.Add(new Common.Export.Cell() { Data = "Единица измерения", MergeAcross = 14 });
            headerrow1.Cells.Add(new Common.Export.Cell() { Data = "Количество", MergeAcross = 15 });
            headerrow1.Cells.Add(new Common.Export.Cell() { Data = "Цена, руб. коп.", MergeAcross = 7, MergeDown = 1 });
            headerrow1.Cells.Add(new Common.Export.Cell() { Data = "Сумма без учета НДС, руб. коп.", MergeAcross = 8, MergeDown = 1 });
            headerrow1.Cells.Add(new Common.Export.Cell() { Data = "Сумма НДС, руб. коп.", MergeAcross = 8, MergeDown = 1 });
            headerrow1.Cells.Add(new Common.Export.Cell() { Data = "Всего с учетом НДС, руб. коп.", MergeAcross = 8, MergeDown = 1 });
            headerrow1.Cells.Add(new Common.Export.Cell() { Data = "Номер", MergeAcross = 15 });
            headerrow1.Cells.Add(new Common.Export.Cell() { Data = "Порядковый номер записи по складской картотеке", MergeAcross = 9, MergeDown = 1 });
            table.HeaderRows.Add(headerrow1);

            var headerrow2 = new Common.Export.Row() { Height = 75 };
            headerrow2.Cells.Add(new Common.Export.Cell() { Data = "счет, субсчет", MergeAcross = 7 });
            headerrow2.Cells.Add(new Common.Export.Cell() { Data = "код аналитического учета", MergeAcross = 11 });
            headerrow2.Cells.Add(new Common.Export.Cell() { Data = "наименование, сорт, размер, марка", MergeAcross = 30 });
            headerrow2.Cells.Add(new Common.Export.Cell() { Data = "Номенклатурный номер", MergeAcross = 7 });
            headerrow2.Cells.Add(new Common.Export.Cell() { Data = "код", MergeAcross = 6 });
            headerrow2.Cells.Add(new Common.Export.Cell() { Data = "наименование", MergeAcross = 7 });
            headerrow2.Cells.Add(new Common.Export.Cell() { Data = "надлежит отпустить", MergeAcross = 7 });
            headerrow2.Cells.Add(new Common.Export.Cell() { Data = "отпущено", MergeAcross = 7 });
            headerrow2.Cells.Add(new Common.Export.Cell() { Data = " ", MergeAcross = 6, Index = 126 });
            headerrow2.Cells.Add(new Common.Export.Cell() { Data = "по центрам затрат. Сумма без учета НДС, руб. коп.", MergeAcross = 8, Index = 133 });
            table.HeaderRows.Add(headerrow2);

            var headerrow3 = new Common.Export.Row();
            headerrow3.Cells.Add(new Common.Export.Cell() { Data = "1", MergeAcross = 7 });
            headerrow3.Cells.Add(new Common.Export.Cell() { Data = "2", MergeAcross = 11 });
            headerrow3.Cells.Add(new Common.Export.Cell() { Data = "3", MergeAcross = 30 });
            headerrow3.Cells.Add(new Common.Export.Cell() { Data = "4", MergeAcross = 7 });
            headerrow3.Cells.Add(new Common.Export.Cell() { Data = "5", MergeAcross = 6 });
            headerrow3.Cells.Add(new Common.Export.Cell() { Data = "6", MergeAcross = 7 });
            headerrow3.Cells.Add(new Common.Export.Cell() { Data = "7", MergeAcross = 7 });
            headerrow3.Cells.Add(new Common.Export.Cell() { Data = "8", MergeAcross = 7 });
            headerrow3.Cells.Add(new Common.Export.Cell() { Data = "9", MergeAcross = 7 });
            headerrow3.Cells.Add(new Common.Export.Cell() { Data = "10", MergeAcross = 8 });
            headerrow3.Cells.Add(new Common.Export.Cell() { Data = "11", MergeAcross = 8 });
            headerrow3.Cells.Add(new Common.Export.Cell() { Data = "12", MergeAcross = 8 });
            headerrow3.Cells.Add(new Common.Export.Cell() { Data = "13", MergeAcross = 6 });
            headerrow3.Cells.Add(new Common.Export.Cell() { Data = "14", MergeAcross = 8 });
            headerrow3.Cells.Add(new Common.Export.Cell() { Data = "15", MergeAcross = 9 });
            table.HeaderRows.Add(headerrow3);

            #endregion Формируются ТРИ строки заголовка таблицы
        }


        /// <summary>
        /// Заполнение документа данными
        /// </summary>
        /// <param name="table"></param>
        /// <param name="data"></param>
        private void appendExcelData(Common.Export.Table table, ConsolidatedAccountInvoiceEntity entity)
        {
            int index = 0;
            double itogoSumma = 0.0;
            double itogoSummaWithoutVAT = 0.0;

            foreach (var item in entity.Specification)
            {
                double price = item.Price.HasValue ? item.Price.Value : 0.0; // ЦЕНА с НДС
                double priceWithoutVAT = price - (price * (1.0 - (1.0 / 1.18)));
                double summa = item.Summa; // СУММА с НДС
                double summaWithoutVAT = summa - (summa * (1.0 - (1.0 / 1.18)));
                itogoSumma += summa;
                itogoSummaWithoutVAT += summaWithoutVAT;

                #region Формирование одной строки экселя

                var row = new Common.Export.Row() { Height = 40 };
                row.Cells.Add(new Common.Export.Cell() // счет, субсчет =???????????????????=
                {
                    Data = "10",
                    Type = "String",
                    MergeAcross = 7
                });
                row.Cells.Add(new Common.Export.Cell() // код аналитического учета =???????????????????=
                {
                    Data = "106218",
                    Type = "String",
                    MergeAcross = 11
                });
                row.Cells.Add(new Common.Export.Cell() // наименование, сорт, размер, марка
                {
                    Data = item.ProductName,
                    Type = "String",
                    MergeAcross = 30
                });
                row.Cells.Add(new Common.Export.Cell() // Центр затрат =???????????????????=
                {
                    Data = "",
                    Type = "String",
                    MergeAcross = 7
                });
                row.Cells.Add(new Common.Export.Cell() // код Единицы измерения
                {
                    Data = item.MUCode,
                    Type = "String",
                    MergeAcross = 6
                });
                row.Cells.Add(new Common.Export.Cell() // наименование Единицы измерения
                {
                    Data = item.MUShortName,
                    Type = "String",
                    MergeAcross = 7
                });
                row.Cells.Add(new Common.Export.Cell() // надлежит отпустить =???????????????????=
                {
                    Data = item.Count.ToString(),
                    Type = "String",
                    MergeAcross = 7
                });
                row.Cells.Add(new Common.Export.Cell() // отпущено
                {
                    Data = item.Count.ToString(),
                    Type = "String",
                    MergeAcross = 7
                });
                row.Cells.Add(new Common.Export.Cell() // Цена, руб. коп.
                {
                    Data = priceWithoutVAT.ToString("#00.00").Replace(",", "."),
                    Type = "Number",
                    MergeAcross = 7
                });
                row.Cells.Add(new Common.Export.Cell() // Сумма без учета НДС, руб. коп.
                {
                    Data = summaWithoutVAT.ToString("#00.00").Replace(",", "."),
                    Type = "Number",
                    MergeAcross = 8
                });
                row.Cells.Add(new Common.Export.Cell() // Сумма НДС, руб. коп.
                {
                    Data = (summa - summaWithoutVAT).ToString("#00.00").Replace(",", "."),
                    Type = "Number",
                    MergeAcross = 8
                });
                row.Cells.Add(new Common.Export.Cell() // Всего с учетом НДС, руб. коп.
                {
                    Data = summa.ToString("#00.00").Replace(",", "."),
                    Type = "Number",
                    MergeAcross = 8
                });
                row.Cells.Add(new Common.Export.Cell() // пустая колонка, без заголовка =???????????????????=
                {
                    Data = "",
                    Type = "String",
                    MergeAcross = 6
                });
                row.Cells.Add(new Common.Export.Cell() // по центрам затрат. Сумма без учета НДС, руб. коп. =???????????????????=
                {
                    Data = "",
                    Type = "String",
                    MergeAcross = 8
                });
                row.Cells.Add(new Common.Export.Cell() // Порядковый номер записи по складской картотеке
                {
                    Data = string.Format("{0}", ++index),
                    Type = "String",
                    MergeAcross = 9
                });
                table.Rows.Add(row);

                #endregion Формирование одной строки экселя
            }

            #region Формирование ИТОГОВОЙ строки таблицы

            var itogoRow = new Common.Export.Row();
            itogoRow.Cells.Add(new Common.Export.Cell()
            {
                Data = "Всего",
                Type = "String",
                MergeAcross = 97
            });
            itogoRow.Cells.Add(new Common.Export.Cell() // Итого по колонке "Сумма без учета НДС, руб. коп."
            {
                Data = itogoSummaWithoutVAT.ToString("#00.00").Replace(",", "."),
                Type = "Number",
                MergeAcross = 8
            });
            itogoRow.Cells.Add(new Common.Export.Cell() // Итого по колонке "Сумма НДС, руб. коп."
            {
                Data = (itogoSumma - itogoSummaWithoutVAT).ToString("#00.00").Replace(",", "."),
                Type = "Number",
                MergeAcross = 8
            });
            itogoRow.Cells.Add(new Common.Export.Cell() // Итого по колонке "Всего с учетом НДС, руб. коп."
            {
                Data = itogoSumma.ToString("#00.00").Replace(",", "."),
                Type = "Number",
                MergeAcross = 8
            });
            itogoRow.Cells.Add(new Common.Export.Cell()
            {
                Data = "",
                Type = "String",
                MergeAcross = 25
            });
            table.Rows.Add(itogoRow);

            #endregion Формирование ИТОГОВОЙ строки таблицы

            #region Формирование строк под таблицей

            RowsAfterRow = 8;

            var afterRow1 = new Common.Export.Row();
            for (int i = 1; i <= 151; i++)
                afterRow1.Cells.Add(new Common.Export.Cell() { Type = "String" });
            table.Rows.Add(afterRow1);

            var afterRow2 = new Common.Export.Row();
            afterRow2.Cells.Add(new Common.Export.Cell()
            {

                Data = string.Format("Всего отпущено {0} {1}", SummToStringHelper.NumPhrase(Convert.ToUInt32(index), true), StringsUtility.Decline(index, "наименование", "наименования", "наименований")), //Data = string.Format("Всего отпущено {0} наименований", SummToStringHelper.NumPhrase(Convert.ToUInt32(index), true)),
                Type = "String",
                MergeAcross = 150
            });
            table.Rows.Add(afterRow2);

            var afterRow3 = new Common.Export.Row();
            for (int i = 1; i <= 151; i++)
                afterRow3.Cells.Add(new Common.Export.Cell() { Type = "String" });
            table.Rows.Add(afterRow3);

            var afterRow4 = new Common.Export.Row();
            afterRow4.Cells.Add(new Common.Export.Cell()
            {
                Data = string.Format("на сумму {0}, в том числе сумма НДС {1} р.",
                                            SummToStringHelper.RurPhrase(Convert.ToDecimal(itogoSumma)),
                                            (itogoSumma - itogoSummaWithoutVAT).ToString("#00.00").Replace(",", ".")),
                Type = "String",
                MergeAcross = 150
            });
            table.Rows.Add(afterRow4);

            var afterRow5 = new Common.Export.Row();
            for (int i = 1; i <= 151; i++)
                afterRow5.Cells.Add(new Common.Export.Cell() { Type = "String" });
            table.Rows.Add(afterRow5);

            var afterRow6 = new Common.Export.Row();
            for (int i = 1; i <= 151; i++)
                afterRow6.Cells.Add(new Common.Export.Cell() { Type = "String" });
            table.Rows.Add(afterRow6);

            var afterRow7 = new Common.Export.Row();
            afterRow7.Cells.Add(new Common.Export.Cell() { StyleID = "rightNonBorderF8", Data = "Отпустил ", Type = "String", MergeAcross = 9 });
            afterRow7.Cells.Add(new Common.Export.Cell() { StyleID = "borderBottom", Type = "String", MergeAcross = 18 });
            afterRow7.Cells.Add(new Common.Export.Cell() { Type = "String" });
            afterRow7.Cells.Add(new Common.Export.Cell() { StyleID = "borderBottom", Type = "String", MergeAcross = 18 });
            afterRow7.Cells.Add(new Common.Export.Cell() { Type = "String" });
            afterRow7.Cells.Add(new Common.Export.Cell() { StyleID = "borderBottom", Data = "", Type = "String", MergeAcross = 21 });
            afterRow7.Cells.Add(new Common.Export.Cell() { Type = "String" });
            afterRow7.Cells.Add(new Common.Export.Cell() { Type = "String" });
            afterRow7.Cells.Add(new Common.Export.Cell() { StyleID = "rightNonBorderF8", Data = "Получил  ", Type = "String", MergeAcross = 9 });
            afterRow7.Cells.Add(new Common.Export.Cell() { StyleID = "borderBottom", Type = "String", MergeAcross = 18 });
            afterRow7.Cells.Add(new Common.Export.Cell() { Type = "String" });
            afterRow7.Cells.Add(new Common.Export.Cell() { StyleID = "borderBottom", Type = "String", MergeAcross = 18 });
            afterRow7.Cells.Add(new Common.Export.Cell() { Type = "String" });
            afterRow7.Cells.Add(new Common.Export.Cell() { StyleID = "borderBottom", Type = "String", MergeAcross = 21 });
            table.Rows.Add(afterRow7);

            var afterRow8 = new Common.Export.Row();
            afterRow8.Cells.Add(new Common.Export.Cell() { StyleID = "centerNonBorderF8", Type = "String", MergeAcross = 9 });
            afterRow8.Cells.Add(new Common.Export.Cell() { StyleID = "centerNonBorderF8", Data = "(должность)", Type = "String", MergeAcross = 18 });
            afterRow8.Cells.Add(new Common.Export.Cell() { Type = "String" });
            afterRow8.Cells.Add(new Common.Export.Cell() { StyleID = "centerNonBorderF8", Data = "(подпись)", Type = "String", MergeAcross = 18 });
            afterRow8.Cells.Add(new Common.Export.Cell() { Type = "String" });
            afterRow8.Cells.Add(new Common.Export.Cell() { StyleID = "centerNonBorderF8", Data = "(расшифровка подписи)", Type = "String", MergeAcross = 21 });
            afterRow8.Cells.Add(new Common.Export.Cell() { Type = "String" });
            afterRow8.Cells.Add(new Common.Export.Cell() { Type = "String" });
            afterRow8.Cells.Add(new Common.Export.Cell() { StyleID = "centerNonBorderF8", Type = "String", MergeAcross = 9 });
            afterRow8.Cells.Add(new Common.Export.Cell() { StyleID = "centerNonBorderF8", Data = "(должность)", Type = "String", MergeAcross = 18 });
            afterRow8.Cells.Add(new Common.Export.Cell() { Type = "String" });
            afterRow8.Cells.Add(new Common.Export.Cell() { StyleID = "centerNonBorderF8", Data = "(подпись)", Type = "String", MergeAcross = 18 });
            afterRow8.Cells.Add(new Common.Export.Cell() { Type = "String" });
            afterRow8.Cells.Add(new Common.Export.Cell() { StyleID = "centerNonBorderF8", Data = "(расшифровка подписи)", Type = "String", MergeAcross = 21 });
            table.Rows.Add(afterRow8);

            #endregion Формирование строк под таблицей
        }



        public Common.Export.ExcelDocument CreateDocument(ConsolidatedAccountInvoiceEntity entity)
        {
            createExcelColumnsAndHeaders(this.Document.Worksheets[0].Table, entity);
            appendExcelData(this.Document.Worksheets[0].Table, entity);
            setStyles(this.Document);

            return this.Document;
        }



    }
}